package cn.net.mugui.net.handle;

import com.alibaba.fastjson.JSONObject;
import com.mugui.Mugui;
import com.mugui.base.base.Autowired;
import com.mugui.base.base.Component;
import com.mugui.base.client.net.base.Module;
import com.mugui.base.client.net.bean.Message;
import com.mugui.base.client.net.bean.NetBag;

import cn.net.mugui.net.p2p.Server;
import cn.net.mugui.net.p2p.ServerAttr;
import cn.net.mugui.net.p2p.ServerManager;
import cn.net.mugui.net.udp.UdpBaseServer;

/**
 * 当链接到一个新的主服务器后，与主服务器之间建立双方属性.<br>
 * 属性处理 <br>
 * 1.判断自身在主服务方向的dns服务器属性<br>
 * 2.从主服务同步可连通的用户列表<br>
 * 3.与返回的用户列表建立点对点链接<br>
 * 4.从主服务拿去服务用户信息<br>
 * 
 * @author pec
 *
 */
@Component
@Module(name = "per", type = "method")
public class PerHandle implements Mugui {

	@Autowired
	private Server server;

	@Autowired
	UdpBaseServer checkServer;

	/**
	 * 返回自身属性
	 * 
	 * @param bag
	 * @return
	 */
	public Message server_per(NetBag bag) {
		int localPort = checkServer.test().getLocalPort();
		ServerAttr self = ServerAttr.self;
		String name = self.getName();
		JSONObject object = new JSONObject();
		object.put("port", checkServer.base().getLocalPort());
		object.put("check_port", localPort);
		object.put("name", name);
		object.put("address", self.getAddress());
		//TODO 得到用户自定义属性。暂时不实现
		return Message.ok(object);
	}
	
	@Autowired
	ServerManager serverManager;
	
	/**
	 * 收到某服务的属性
	 * 
	 * @param bag
	 * @return
	 */
	public Message putSelfPer(NetBag bag) {
		ServerAttr serverAttr = serverManager.get(bag.getSession());
		if (serverAttr.getHost().equals(bag.getFrom_host())) {// 该服务器为固定端口服务器。开始检测是否可为主服务器
			if (serverAttr.getPort() == (int) bag.getFrom_port()) {
				serverAttr.setType(ServerAttr.type_2);
			} else {
				serverAttr.setType(ServerAttr.type_3);
			}
		}
		System.out.println(bag);
		return Message.ok();
	}

	/**
	 * 是否可p2p连通
	 * 
	 * @param bag
	 * @return
	 */
	public Message isP2PConnected(NetBag bag) {
		ServerAttr self = ServerAttr.self;
		String select = bag.getData().toString();
		if (self.getAddress().equalsIgnoreCase(select)) {
			return Message.ok("self");
		}
		ServerAttr from_ = serverManager.get(bag.getSession());

		ServerAttr to_ = serverManager.get(select);
		if (ServerAttr.type_1 == from_.getType()) {// 向to发送直接连通消息

			return Message.ok();
		}
		if (ServerAttr.type_1 == to_.getType()) {// 向from发送直接连通消息

			return Message.ok();
		}
		if (ServerAttr.type_2 == from_.getType() && ServerAttr.type_2 == to_.getType()) {// 双方可直接打通
			return Message.ok();
		}
		if (ServerAttr.type_2 == from_.getType()) {// 可尝试打通
			return Message.ok();
		}
		if (ServerAttr.type_2 == to_.getType()) {// 可尝试打通
			return Message.ok();
		}
		return Message.error("");
	}

}
